#| echo: false
#| include: false
library(reticulate)
use_condaenv("/Users/tomasz/opt/anaconda3/bin/python", required = TRUE)

Alternatywne miary ryzyka

  • Miara ryzyka powinna się skupiać na ujemnych zwrotach, np. największym spadku (ang. Maximum Drawdown) lub współczynniku Sortino.

Alternatywne miary ryzyka

Współczynnik Sharpe’a

\[ \small{ Sharpe = (R_p-R_f)\cdot{\sigma_j}^{-1}, \\ Sharpe - \text{współczynnik Sharpe'a}, \\ R_p - \text{zannualizowana średnia stopa zwrotu}, \\ R_f - \text{stopa zwrotu wolna od ryzyka}, \\ \sigma_j - \text{odchylenie standardowe portfela}.} \]

Współczynnik Sortino

\[ \small{ Sortino = (R_j-R_f)\cdot{\sigma_d}^{-1}, \\ Sortino - \text{współczynnik Sortino}, \\ R_j - \text{zannualizowana średnia stopa zwrotu}, \\ R_f - \text{stopa zwrotu wolna od ryzyka}, \\ \sigma_d = \sqrt{\frac{1}{n}\sum_{i=1}^{n} \min(0, R_i - R_f)^2} - \\ -\text{ odchylenie standardowe ujemnych zwrotów}. } \]

Współczynnik Sortino

GOOGL
Date
2006-01-03 217.62
2006-01-04 222.62
2006-01-05 225.62
2006-01-06 232.83
2006-01-09 233.45
... ...
2015-12-24 765.84
2015-12-28 782.24
2015-12-29 793.96
2015-12-30 790.30
2015-12-31 778.01

2517 rows × 1 columns

Wskaźnik Sortino dla akcji Google

rfr = 0.04
target_return = 0

returns = data.pct_change()
negative_returns = returns.loc[returns['GOOGL'] < target_return]
expected_return = returns.mean()
annualized_return = (expected_return+1)**252 - 1
down_std = negative_returns.std()

sortino_ratio = (annualized_return - rfr) / (down_std*np.sqrt(252))

Sortino dla akcji Google wynosi ok. 0.702.

Sharpe dla akcji Google wynosi ok. 0.488.

Alternatywne miary ryzyka

Największy spadek (ang. Maximum Drawdown)

  • Największa procentowa strata od szczytu do dna.

  • Zależy od wybranego okna czasowego.

Największy spadek (ang. Maximum Drawdown)

# Maksymalne spadki
roll_max = data.rolling(center=False, min_periods=1, window=252).max()

# Dzienny spadek w stosunku do maksimum
daily_draw_down = data/roll_max - 1.0

# Maksymalny dzienny spadek
max_daily_draw_down = daily_draw_down.rolling(center=False, min_periods=1, window=252).min()

# Wykres
plt.figure(figsize=(15,8))
plt.plot(data.index, daily_draw_down, label='Dzienne spadki')
plt.plot(data.index, max_daily_draw_down, label='Maksymalne spadki w okresie 252 dni')
plt.legend()
plt.show()

Pyfolio

Pyfolio

Dane

positions = pd.read_csv('data/test_pos.csv', index_col=0)
positions.index = pd.to_datetime(positions.index)
display(positions)
AMD CERN COST DELL GPS INTC MMM cash
index
2004-01-09 00:00:00+00:00 6961.92 21017.078750 7282.266152 21264.55188 7091.080020 21259.333890 21316.129606 -6192.360298
2004-01-12 00:00:00+00:00 18198.58 18071.250000 17675.836401 10804.31924 10685.411865 17872.477480 10882.026400 -3329.289887
2004-01-13 00:00:00+00:00 12060.86 11942.246250 12838.477446 16078.90380 16272.139000 12465.392511 12579.135758 4708.039735
2004-01-14 00:00:00+00:00 13102.40 15534.281250 14447.422640 15414.45080 15666.440185 14884.069620 13454.542620 -2749.470030
2004-01-15 00:00:00+00:00 15518.40 14547.050000 14164.039680 14407.48813 14926.122619 14422.385864 13929.159049 -2462.919316
... ... ... ... ... ... ... ... ...
2009-12-24 00:00:00+00:00 -1199.11 1316.857500 22778.660580 -3562.47039 76601.638113 36280.269375 17740.890304 16350.679211
2009-12-28 00:00:00+00:00 589.80 673.840032 24170.422856 -1765.41500 83143.517604 37499.607147 15692.520137 7641.201795
2009-12-29 00:00:00+00:00 292.50 334.920016 20993.396552 858.85252 94500.729990 50509.461877 7946.648597 -6583.290764
2009-12-30 00:00:00+00:00 1681.56 -167.179992 34934.764512 91207.82625 29751.588246 38052.304640 -3926.109096 -22234.787956
2009-12-31 00:00:00+00:00 22254.32 9975.240484 47781.667800 53022.51955 27393.148240 18850.582240 -1934.275491 -11938.952799

1506 rows × 8 columns

Pyfolio

Tear Sheet

returns = positions.sum(axis=1).pct_change().dropna()

pf.create_returns_tear_sheet(returns)
Start date 2004-01-12
End date 2009-12-31
Total months 71
Backtest
Annual return 8.791%
Cumulative returns 65.404%
Annual volatility 26.26%
Sharpe ratio 0.45
Calmar ratio 0.15
Stability 0.00
Max drawdown -60.391%
Omega ratio 1.09
Sortino ratio 0.66
Skew 0.14
Kurtosis 5.88
Tail ratio 0.99
Daily value at risk -3.261%
Worst drawdown periods Net drawdown in % Peak date Valley date Recovery date Duration
0 60.39 2007-11-06 2009-03-09 NaT NaN
1 24.10 2005-07-28 2006-09-07 2007-05-22 474
2 11.89 2004-06-25 2004-08-12 2004-11-05 96
3 10.87 2004-11-15 2005-04-18 2005-07-14 174
4 9.51 2007-07-16 2007-08-06 2007-09-13 44

Pyfolio

Position Tear Sheet

# Mapowanie sektorów
sect_map = {'COST': 'Consumer Goods',
            'INTC': 'Technology', 
            'CERN': 'Healthcare', 
            'GPS': 'Technology',
            'MMM': 'Construction', 
            'DELL': 'Technology', 
            'AMD': 'Technology'}

pf.create_position_tear_sheet(returns,positions, sector_mappings=sect_map)
Top 10 long positions of all time max
COST 90.01%
DELL 85.73%
CERN 83.53%
MMM 82.09%
INTC 78.59%
AMD 75.76%
GPS 62.24%
Top 10 short positions of all time max
AMD -30.12%
DELL -26.58%
CERN -25.51%
MMM -22.62%
GPS -20.09%
INTC -18.47%
COST -16.44%
Top 10 positions of all time max
COST 90.01%
DELL 85.73%
CERN 83.53%
MMM 82.09%
INTC 78.59%
AMD 75.76%
GPS 62.24%